/*!
 * \file ParserAdapter.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 行情解析器适配器定义文件
 * 
 * \details 定义了行情解析器的适配器类和管理器类，用于统一管理和适配不同类型的行情数据源。
 *          该模块提供了标准化的行情数据接口，支持Tick数据、Level2数据（委托队列、委托明细、
 *          成交明细）的统一处理和分发，是UFT系统中连接外部行情源和内部数据处理的关键组件。
 */
#pragma once
#include <memory>
#include <boost/core/noncopyable.hpp>

#include "../Includes/FasterDefs.h"
#include "../Includes/IParserApi.h"


NS_WTP_BEGIN
class WTSVariant;

/*!
 * \class IParserStub
 * \brief 行情解析器桩接口
 * 
 * \details 定义了行情数据处理的回调接口，用于接收和处理从行情适配器传递的各种市场数据。
 *          该接口作为行情数据的消费者，由具体的数据处理模块实现，实现数据的最终处理和分发。
 * 
 * \note 所有方法都有默认的空实现，允许派生类选择性地重写需要的方法
 */
class IParserStub
{
public:
	/*!
	 * \brief 处理推送的行情数据
	 * \param curTick 当前Tick数据指针
	 * 
	 * \details 接收并处理实时Tick行情数据，包括最新价、成交量、买卖盘等信息
	 */
	virtual void			handle_push_quote(WTSTickData* curTick){}

	/*!
	 * \brief 处理推送的委托明细数据
	 * \param curOrdDtl 当前委托明细数据指针
	 * 
	 * \details 接收并处理Level2委托明细数据，提供逐笔委托的详细信息
	 */
	virtual void			handle_push_order_detail(WTSOrdDtlData* curOrdDtl){}
	
	/*!
	 * \brief 处理推送的委托队列数据
	 * \param curOrdQue 当前委托队列数据指针
	 * 
	 * \details 接收并处理Level2委托队列数据，提供订单簿的深度信息
	 */
	virtual void			handle_push_order_queue(WTSOrdQueData* curOrdQue) {}
	
	/*!
	 * \brief 处理推送的成交明细数据
	 * \param curTrans 当前成交明细数据指针
	 * 
	 * \details 接收并处理Level2成交明细数据，提供逐笔成交的详细信息
	 */
	virtual void			handle_push_transaction(WTSTransData* curTrans) {}
};

/*!
 * \class ParserAdapter
 * \brief 行情解析器适配器类
 * 
 * \details 行情解析器的适配器实现，继承自IParserSpi接口，作为外部行情API和内部数据处理
 *          系统之间的桥梁。主要功能包括：
 *          - 管理行情解析器API的生命周期
 *          - 接收各种类型的市场数据
 *          - 数据过滤和预处理
 *          - 将数据转发给数据处理桩
 *          - 提供统一的行情数据接口
 * 
 * \note 该类继承自boost::noncopyable，不支持拷贝构造和赋值操作
 * \warning 需要确保在多线程环境下的数据安全性
 */
class ParserAdapter : public IParserSpi,
					private boost::noncopyable
{
public:
	/*!
	 * \brief 构造函数
	 * 
	 * \details 初始化行情适配器，设置默认参数
	 */
	ParserAdapter();
	
	/*!
	 * \brief 析构函数
	 * 
	 * \details 清理适配器资源，确保正确释放行情API
	 */
	~ParserAdapter();

public:
	/*!
	 * \brief 初始化行情适配器
	 * \param id 适配器唯一标识
	 * \param cfg 配置参数
	 * \param stub 数据处理桩指针
	 * \param bgMgr 基础数据管理器指针
	 * \return bool 初始化是否成功
	 * 
	 * \details 根据配置参数初始化行情适配器，加载指定的行情解析器模块，
	 *          建立与数据处理桩的连接关系
	 */
	bool	init(const char* id, WTSVariant* cfg, IParserStub* stub, IBaseDataMgr* bgMgr);
	
	/*!
	 * \brief 扩展初始化方法
	 * \param id 适配器唯一标识
	 * \param api 外部提供的解析器API指针
	 * \param stub 数据处理桩指针
	 * \param bgMgr 基础数据管理器指针
	 * \return bool 初始化是否成功
	 * 
	 * \details 使用外部提供的解析器API进行初始化，适用于已有API实例的场景
	 */
	bool	initExt(const char* id, IParserApi* api, IParserStub* stub, IBaseDataMgr* bgMgr);

	/*!
	 * \brief 释放适配器资源
	 * 
	 * \details 停止行情接收，释放解析器API，清理所有相关资源
	 */
	void	release();

	/*!
	 * \brief 启动行情适配器
	 * \return bool 启动是否成功
	 * 
	 * \details 启动行情数据接收，开始处理市场数据流
	 */
	bool	run();

	/*!
	 * \brief 获取适配器ID
	 * \return const char* 适配器唯一标识
	 */
	const char* id() const{ return _id.c_str(); }

public:
	/*!
	 * \brief 处理合约列表
	 * \param aySymbols 合约列表数组
	 * 
	 * \details 接收并处理行情源推送的合约列表信息，当前为空实现
	 */
	virtual void handleSymbolList(const WTSArray* aySymbols) override {}

	/*!
	 * \brief 处理实时行情数据
	 * \param quote 实时行情数据指针
	 * \param procFlag 处理标志
	 * 
	 * \details 接收并处理实时Tick行情数据，进行必要的数据验证和过滤，
	 *          然后转发给数据处理桩进行后续处理
	 */
	virtual void handleQuote(WTSTickData *quote, uint32_t procFlag) override;

	/*!
	 * \brief 处理委托队列数据
	 * \param ordQueData 委托队列数据指针
	 * 
	 * \details 接收并处理Level2委托队列数据，提供订单簿深度信息，
	 *          经过适配器处理后转发给数据处理桩
	 */
	virtual void handleOrderQueue(WTSOrdQueData* ordQueData) override;

	/*!
	 * \brief 处理委托明细数据
	 * \param ordDetailData 委托明细数据指针
	 * 
	 * \details 接收并处理Level2委托明细数据，提供逐笔委托的详细信息，
	 *          经过适配器处理后转发给数据处理桩
	 */
	virtual void handleOrderDetail(WTSOrdDtlData* ordDetailData) override;

	/*!
	 * \brief 处理成交明细数据
	 * \param transData 成交明细数据指针
	 * 
	 * \details 接收并处理Level2成交明细数据，提供逐笔成交的详细信息，
	 *          经过适配器处理后转发给数据处理桩
	 */
	virtual void handleTransaction(WTSTransData* transData) override;

	/*!
	 * \brief 处理解析器日志
	 * \param ll 日志级别
	 * \param message 日志消息
	 * 
	 * \details 接收并处理来自行情解析器的日志信息，用于监控和调试
	 */
	virtual void handleParserLog(WTSLogLevel ll, const char* message) override;

	/*!
	 * \brief 获取基础数据管理器
	 * \return IBaseDataMgr* 基础数据管理器指针
	 * 
	 * \details 返回当前使用的基础数据管理器，用于合约信息查询等基础数据操作
	 */
	virtual IBaseDataMgr* getBaseDataMgr() override { return _bd_mgr; }


private:
	IParserApi*			_parser_api;		///< 行情解析器API指针
	FuncDeleteParser	_remover;			///< 解析器删除函数指针

	bool				_stopped;			///< 停止标志，用于控制适配器状态

	typedef faster_hashset<std::string>	ExchgFilter;	///< 交易所过滤器类型定义
	ExchgFilter			_exchg_filter;		///< 交易所过滤器，用于过滤指定交易所的数据
	ExchgFilter			_code_filter;		///< 代码过滤器，用于过滤指定合约的数据
	IBaseDataMgr*		_bd_mgr;			///< 基础数据管理器指针
	IParserStub*		_stub;				///< 数据处理桩指针
	WTSVariant*			_cfg;				///< 配置参数指针
	std::string			_id;				///< 适配器唯一标识
};

/*!
 * \typedef ParserAdapterPtr
 * \brief 行情适配器智能指针类型定义
 */
typedef std::shared_ptr<ParserAdapter>	ParserAdapterPtr;

/*!
 * \typedef ParserAdapterMap
 * \brief 行情适配器映射表类型定义
 */
typedef faster_hashmap<std::string, ParserAdapterPtr>	ParserAdapterMap;

/*!
 * \class ParserAdapterMgr
 * \brief 行情适配器管理器类
 * 
 * \details 负责管理多个行情适配器的生命周期，提供统一的适配器访问接口。
 *          主要功能包括：
 *          - 管理多个行情适配器实例
 *          - 提供适配器的添加、查找和删除功能
 *          - 统一控制所有适配器的启动和停止
 *          - 资源管理和清理
 * 
 * \note 该类继承自boost::noncopyable，不支持拷贝构造和赋值操作
 */
class ParserAdapterMgr : private boost::noncopyable
{
public:
	/*!
	 * \brief 释放管理器资源
	 * 
	 * \details 停止并释放所有管理的行情适配器，清理相关资源
	 */
	void	release();

	/*!
	 * \brief 启动所有适配器
	 * 
	 * \details 启动管理器中的所有行情适配器，开始数据接收
	 */
	void	run();

	/*!
	 * \brief 获取指定适配器
	 * \param id 适配器唯一标识
	 * \return ParserAdapterPtr 适配器智能指针，如果不存在则返回空指针
	 * 
	 * \details 根据ID查找并返回对应的行情适配器
	 */
	ParserAdapterPtr getAdapter(const char* id);

	/*!
	 * \brief 添加适配器
	 * \param id 适配器唯一标识
	 * \param adapter 适配器智能指针
	 * \return bool 添加是否成功
	 * 
	 * \details 将新的行情适配器添加到管理器中，如果ID已存在则返回失败
	 */
	bool	addAdapter(const char* id, ParserAdapterPtr& adapter);


public:
	ParserAdapterMap _adapters;		///< 适配器映射表，存储所有管理的适配器
};

NS_WTP_END